package com.wang.handler;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

//拦截器类,拦截用户的请求
public class MyInterceptor implements HandlerInterceptor {
    /**
     * preHandle预处理方法
     * Object handler参数是被拦截的控制器对象(也就是程序中的myController对象)
     * 返回值是布尔值!
     * 特点:1.方法再控制器方法(mycontroler的doSome)方法之前先执行
     *     2.在这里,这个方法可以获取请求的信息,验证请求是否复合要求
     *     验证用户是否有权限登录,验证用户是否有权限访问某个url,
     *     如果验证失败可以截断请求
     *     如果验证成功可以放行请求
     *     此时控制器方法才能执行
     */
    private long btime = 0;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        btime = System.currentTimeMillis();
        if (request.getSession().getAttribute("name") == null){
            request.setAttribute("loginmsg","需要登录才能操作哦~");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return false;
        }
        String name = request.getParameter("name");
        System.out.println("拦截器MyInterceptor的preHandle()");
        if ("王子奇".equals(name)){
            request.getRequestDispatcher("/tips.jsp").forward(request,response);
            return false;
        }
        return true;
    }

    /**
     * postHandle后处理方法:Object handler是被拦截的处理器对象Mycontroller
     * ModelAndView modelAndView是处理器方法的返回值 return mv的mv
     * 特点: 1.在处理器方法之后执行的(doSome方法之后执行)
     *      2.可以获取处理器方法的返回值mv,可以修改modelandView中的数据和视图,
     *      3.主要是对原来的执行结果作二次修正
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器MyInterceptor的postHandle()");
        //对原来的doSome方法返回值进行二次修正
        if(modelAndView!=null){
            //修改数据
            modelAndView.addObject("mydate",new Date());
            //修改视图
            modelAndView.setViewName("result");
        }
    }

    /**
     * afterCompletion:最后执行的方法
     * 参数: Object handler是被拦截的处理器对象Mycontroller
     *      Exception ex是程序中发生的异常
     * 特点:
     *      1.请求处理完成后执行,(框架中规定也就是,当你的试图处理返程后,对视图执行forward,就认为请求处理完成)
     *      2.一般是做资源回收的,在程序请求的处理过程中创建的一些对象,在这里可以进行删除,清理资源
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器MyInterceptor的afterCompletion()");
        long etime = System.currentTimeMillis();
        System.out.println("计算从preHandler到请求处理完成的时间"+(etime-btime));
    }
}
